#include <iostream>
#include <typeinfo>
#include <cxxabi.h>
#include <list>
using namespace std;

template <typename T>
void print(T t)
{
    std::cout << t << std::endl;
}

int &func();

class Test
{
public:
    int val;
};

template <typename T>
class Continer
{
public:
    void func(T &c)
    {
        for (iter = c.begin(); iter != c.end(); iter++)
        {
            printf("%d ", *iter);
        }
        printf("\n");
    }

private:
    decltype(T().begin()) iter; // 解决迭代器类型不确定的问题，const或非const
};

template <typename R, typename T, typename U>
auto add(T t, U u) -> decltype(t + u)
{
    return t + u;
}

void test()
{
    int x = 10;
    double y = 1.0;
    // auto z = add<int, int, double>(x, y);
    // auto z = add<decltype(x + y), int, double>(x, y);
    // auto z = add<decltype(x + y)>(x, y);
    auto z = add<int, double>(x, y);
    print(z);
}

int main()
{
    // int a = 10;
    // decltype(a) b = 10;
    // decltype(func) e;
    // // Test obj;
    // // decltype(obj.val) a;
    // // decltype((obj.val)) c = a;

    // const list<int> lst{1, 2, 3, 4, 5, 6};
    // Continer<const list<int>> obj;
    // obj.func(lst);
    test();
    return 0;
}